import { Node } from "cc";


export interface IGameEntity{
    get node():Node;
    add<T extends IGameComponent>(comp:{new():T})
    get(name:string):IGameComponent
    remove(name:string)

}
export interface IGameComponent{
    get NAME():string
    /** 当前系统所在的节点 */
    get node():Node
    get owner():IGameEntity
 
    add<T extends IGameSystem>(system:{new():T})
    get(name:string):IGameSystem
    remove(name:string)

    removeAll();

    init();
    /**
     * websocket 请求
     * @param msg       请求消息
     * @param data      请求数据
     * @param callback  请求完成回调
     * 
     */
    send(msg:string,data:any,callback?:()=>void);
    /**
     * http请
     * @param path  url 请求地址
     * @param data  请求数据
     * @param type  请求类型
     * 
     */
    request(path:string,data:any,type?:string):Promise<any>;

    addMsg(msg:string,callFun:any,caller:any);
    sendMsg(msg:string,...params:any)
    removeMsg(msg:string,callFun:any,caller:any)
    removeGroup()
    
    /** 将消息添加到全局消息模块中 */
    addWorld(msg:string,callFun:any,caller:any)
    /** 发送全局消息 */
    sendWorld(msg:string,...params)
    /** 删除全局消息监听 */
    removeWorld(msg:string,callFun:any,caller:any)

    update(dt:number);
    lateUpdate(dt:number);

}
export interface IGameSystem {
    get NAME():string
    /** 获取当前系统的组件 */
    get owner():IGameComponent
    /** 当前系统所在的节点 */
    get node():Node

    /** 给当前系统添加逻辑处理对象 */
    add<T extends IGameLogic>(logic:{new():T}):IGameLogic
    /** 通过逻辑对象名称找逻辑对象 */
    get(name:string):IGameLogic;
    /** 删除逻辑对象操作 */
    remove(name:string);

    removeAll();
    init();

    /**
     * websocket 请求
     * @param msg       请求消息
     * @param data      请求数据
     * @param callback  请求完成回调
     * 
     */
    send(msg:string,data:any,callback?:()=>void);
    /**
     * http请
     * @param path  url 请求地址
     * @param data  请求数据
     * @param type  请求类型
     * 
     */
    request(path:string,data:any,type?:string):Promise<any>;

    addMsg(msg:string,callFun:any,caller:any);
    sendMsg(msg:string,...params:any)
    removeMsg(msg:string,callFun:any,caller:any)
    removeGroup()

    addWorld(msg:string,callFun:any,caller:any)
    sendWorld(msg:string,...params)
    removeWorld(msg:string,callFun:any,caller:any)

    update(dt:number);
    lateUpdate(dt:number);

}
export interface IGameLogic{
    get NAME():string
    get owner():IGameSystem 
    /** 当前系统所在的节点 */
    get node():Node
    
    init();
    /** 执行当前逻辑对象逻辑 */
    execute(...params:any)
    onDestroy();
    
    /**
     * websocket 请求
     * @param msg       请求消息
     * @param data      请求数据
     * @param callback  请求完成回调
     * 
     */
    send(msg:string,data:any,callback?:()=>void);
    /**
     * http请
     * @param path  url 请求地址
     * @param data  请求数据
     * @param type  请求类型
     * 
     */
    request(path:string,data:any,type?:string):Promise<any>;

    addMsg(msg:string,callFun:any,caller:any);
    sendMsg(msg:string,...params:any)
    removeMsg(msg:string,callFun:any,caller:any)
    removeGroup()

    addWorld(msg:string,callFun:any,caller:any)
    sendWorld(msg:string,...params)
    removeWorld(msg:string,callFun:any,caller:any)

    update(dt:number);
    lateUpdate(dt:number);
}